package com.example.demo.config;

import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

@Configuration
public class RestTemplateConfig {

    @Bean(value = {"restTemplate"})
    public RestTemplate restTemplate() {
        return createRestTemplate();
    }

    //解决中文乱码问题
    private RestTemplate createRestTemplate() {
        RestTemplate restTemplate = new RestTemplateBuilder().requestFactory(OkHttp3ClientHttpRequestFactory.class)
                .setConnectTimeout(Duration.ofSeconds(500)).setReadTimeout(Duration.ofSeconds(3000)).build();

        List<HttpMessageConverter<?>> converters = restTemplate.getMessageConverters();
        Iterator<HttpMessageConverter<?>> iterator = converters.iterator();

        while (iterator.hasNext()) {
            HttpMessageConverter<?> converter = iterator.next();
            if (converter instanceof MappingJackson2XmlHttpMessageConverter){
                // 删除xml序列化，内部微服务之间用json交互
                iterator.remove();
            }else if (converter instanceof StringHttpMessageConverter){
                // 解决使用restTemplate中文乱码的问题
                List<MediaType> mediaTypes = new ArrayList<>();
                mediaTypes.add(MediaType.APPLICATION_JSON);
//                mediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
                mediaTypes.add(MediaType.TEXT_PLAIN);
//                mediaTypes.add(MediaType.TEXT_HTML);
//                mediaTypes.add(MediaType.TEXT_XML);
//                mediaTypes.add(MediaType.APPLICATION_STREAM_JSON);
//                mediaTypes.add(MediaType.APPLICATION_ATOM_XML);
                mediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
//                mediaTypes.add(MediaType.APPLICATION_PDF);
               ((StringHttpMessageConverter) converter).setSupportedMediaTypes(mediaTypes);
               ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8);
            }
        }

        return restTemplate;
    }


}

